#include "new_window.h"
#include "ui_new_window.h"
#include "mainwindow.h"
#include "QLabel"
#include "time.h"
#include <QMessageBox>

unsigned short arr[4][4]={};
// 用来记录处理方向键时是否发生移动或合并
bool is_move_merge = true;

new_window::new_window(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::new_window)
{
    ui->setupUi(this);
    srand(time(NULL));
    create_num();
    show_score();
    show_arr();
}

new_window::~new_window()
{
    delete ui;
}

//收到方向信号程序运行
void new_window::keyPressEvent(QKeyEvent *event)
{
    //显示
    //show_arr();


    is_move_merge = false;
    //判断方向
    switch(event->key())
    {
    qDebug("213");

    case Qt::Key_W:
        game1.direction_up();break;
    case Qt::Key_S:
        game1.direction_down();break;
    case Qt::Key_A:
        game1.direction_left();break;
    case Qt::Key_D:
        game1.direction_right();break;
    }

    //创建一个数
    create_num();

    show_arr();
    show_score();
    //检查游戏是否结束
    if(check_state())
    {
        QMessageBox::information(NULL, "2048", "游戏结束", QMessageBox::Yes , QMessageBox::Yes);
    }
}

//显示分数
void new_window::show_score()
{
    int max = 0;
    for(int i=0; i<4; i++)
    {
        for(int j=0; j<4; j++)
        {
            if(max < arr[i][j])
            {
                max = arr[i][j];
            }
        }
    }
    ui->label->setText(QString::number(max));
}

//生成一个数
void new_window::create_num()
{
    // 判断is_move_merge如果为假则函数结束
    // 如果数组中没有空位置则函数结束
    if(!is_move_merge || 0>= count_null())
    {
        return;
    }

    // 进入死循环，直到随机出合适的位置
    for(;;)
    {
        int x = rand()%4;
        int y = rand()%4;
        if(arr[x][y]) continue;

    // 按照概念概率创建整数：2:80% 4:15% 8:5%
        int chance = rand()%100;
        if(chance < 80)
        {
            arr[x][y] = 2;
        }
        else if(chance < 95)
        {
            arr[x][y] = 4;
        }
        else
        {
            arr[x][y]=8;
        }
        return;
    }
}

//计算空位值
int new_window::count_null()
{
    int count=0;
    for(int i=0;i<4;i++)
    {
        for(int j=0;j<4;j++)
        {
            if(0 == arr[i][j])
            {
                count++;
            }
        }
    }
    return count;
}

//检查游戏是否死亡
bool new_window::check_state(void)
{
    //如果有空位置返回假
    if(count_null())
    {
        return false;
    }
    for(int i=0;i<4;i++)
    {
        for(int j=0;j<4;j++)
        {
            //如果左右相邻的有相同数字则返回假
            if( i<3 && arr[i][j] == arr[i+1][j])
            {
                return false;
            }
            //如果上下相邻的有相同数字则返回假
            if(j<3 && arr[i][j] == arr[i][j+1])
            {
                return false;
            }
        }
    }
    //此时应该返回真
    return true;
}

//显示
void new_window::show_arr()
{
    //第一行
    if(arr[0][0])  ui->label->setText(QString::number(arr[0][0]));
    else ui->label->setText("");
    if(arr[0][1])  ui->label_2->setText(QString::number(arr[0][1]));
    else ui->label_2->setText("");
    if(arr[0][2])  ui->label_3->setText(QString::number(arr[0][2]));
    else ui->label_3->setText("");
    if(arr[0][3])  ui->label_4->setText(QString::number(arr[0][3]));
    else ui->label_4->setText("");

    //第二行
    if(arr[1][0])  ui->label_5->setText(QString::number(arr[1][0]));
    else ui->label_5->setText("");
    if(arr[1][1])  ui->label_6->setText(QString::number(arr[1][1]));
    else ui->label_6->setText("");
    if(arr[1][2])  ui->label_7->setText(QString::number(arr[1][2]));
    else ui->label_7->setText("");
    if(arr[1][3])  ui->label_8->setText(QString::number(arr[1][3]));
    else ui->label_8->setText("");

    //第三行
    if(arr[2][0])  ui->label_9->setText(QString::number(arr[2][0]));
    else ui->label_9->setText("");
    if(arr[2][1])  ui->label_10->setText(QString::number(arr[2][1]));
    else ui->label_10->setText("");
    if(arr[2][2])  ui->label_11->setText(QString::number(arr[2][2]));
    else ui->label_11->setText("");
    if(arr[2][3])  ui->label_12->setText(QString::number(arr[2][3]));
    else ui->label_12->setText("");

    //第四行
    if(arr[3][0])  ui->label_13->setText(QString::number(arr[3][0]));
    else ui->label_13->setText("");
    if(arr[3][1])  ui->label_14->setText(QString::number(arr[3][1]));
    else ui->label_14->setText("");
    if(arr[3][2])  ui->label_15->setText(QString::number(arr[3][2]));
    else ui->label_15->setText("");
    if(arr[3][3])  ui->label_16->setText(QString::number(arr[3][3]));
    else ui->label_16->setText("");
}

void new_window::on_new_btn_clicked()
{
    for(int i=0; i<4; i++)
    {
        for(int j=0; j<4; j++)
        {
            arr[i][j] = 0;
        }
    }
    ui->label->setText("");
    srand(time(NULL));
    create_num();
    show_score();
    show_arr();
}
void new_window::on_pushButton_clicked()
{
    this->close();
}
